package com.ruoyi.web.controller.system;

import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.WxUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.interview.service.IWxUserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * @author huangjie
 * @date 2025/11/18
 */
@RestController
public class SMSCodeController {
    //注入redis
    private final RedisCache redisCache;
    private final IWxUserService iwxUserService;

    public SMSCodeController(RedisCache redisCache, IWxUserService iwxUserService) {
        this.redisCache = redisCache;
        this.iwxUserService = iwxUserService;
    }

    /**
     * 发送短信验证码
     * @param mobile 手机号
     * @return 短信验证码
     */
    @GetMapping("/sendCode")
    public AjaxResult sendCode(String phone){
        //0.校验手机号
        if(!phone.matches(CacheConstants.PHONE_REGEX)){
            return AjaxResult.error("手机号格式错误");
        }
        //1.生成一个6位数由0-9组成的验证码
        String code = generateCode();
        System.out.println("验证码为：------"+code);
        //2.将验证码发送到手机号

        //3.把验证码缓存到服务端-redis    键：由手机号+前缀拼接  值：验证码  过期时间：2分钟
        redisCache.setCacheObject(CacheConstants.SMS_CODE_PRE+phone,code,2, TimeUnit.MINUTES);

        //4.响应结果
        return AjaxResult.success();
    }


    /**
     * 重新发送短信验证码
     * @param mobile 手机号
     * @return 短信验证码
     */
    @GetMapping("/sendCodeNew")
    public AjaxResult sendCodeNew(String phone){
        //0.校验手机号
        if(!phone.matches(CacheConstants.PHONE_REGEX)){
            return AjaxResult.error("手机号格式错误");
        }

        //1.从redis中获取验证码
        String codeInRedis = redisCache.getCacheObject(CacheConstants.SMS_CODE_PRE + phone);
        //2.判断验证码是否存在
        String code = null;
        String redisValue=null;
        if(StringUtils.isEmpty(codeInRedis)){
            //2.1没查到  .生成一个6位数由0-9组成的验证码
            code = generateCode();
            //并加上当前时间戳
            redisValue=code+","+System.currentTimeMillis();//142456,1699456000000
            System.out.println("验证码为：------"+code);
        }else {
            //2.2 查询到
            //取得验证码
             code =  codeInRedis.split(",")[0];//通过分割取得验证码
            //取得上次发送时间
            long lastSendTime = Long.parseLong(codeInRedis.split(",")[1]);
            //2.2.1 是否过重发时间
            if(System.currentTimeMillis()-lastSendTime<=30*1000){
                //没过
                return  AjaxResult.error("非法请求！");
            }
            //2.2.2 过了时间，刷新验证码的时间
            redisValue=code+","+System.currentTimeMillis();//142456,1699456000000

        }
        //3.把验证码缓存到服务端-redis    键：由手机号+前缀拼接  值：验证码  过期时间：2分钟
        redisCache.setCacheObject(CacheConstants.SMS_CODE_PRE+phone,redisValue,5, TimeUnit.MINUTES);

        //4.响应结果
        return AjaxResult.success();
    }



    /**
     * 绑定手机号
     * @param phone
     * @param code
     * @return
     */
    @GetMapping("/bindphone")
    public AjaxResult bindPhone(String phone,String code){
        //1.根据手机号从redis中获取验证码
        String cacheCode = redisCache.getCacheObject(CacheConstants.SMS_CODE_PRE+phone);
        //分割验证码和时间戳，取得验证码
        cacheCode=cacheCode.split(",")[0];
        //2.和前端发送的验证码对比
        if(StringUtils.isEmpty(cacheCode)||!cacheCode.equals(code)){//验证码为空或错误
            return AjaxResult.error("验证码错误");
        }
        //3.比对成功  修改当前用户的手机号
        //通过工具类获取用户id
        Long userId = SecurityUtils.getLoginUser().getUserId();
        //调用service方法修改手机号
        WxUser wxUser=iwxUserService.updatePhoneById(userId,phone);
        //返回更新后的用户信息
        return AjaxResult.success().put("userInfo",wxUser);
    }



    /**
     * 生成短信验证码方法
     * @return 短信验证码
     */
    private String generateCode(){
        String code = "";
        Random random = new Random();
        for(int i=0;i<6;i++){
            //字符串拼接
            code += random.nextInt(10);//生成0-9的随机数
        }
        return code;
    }
}
